# -*- coding: utf-8 -*-
import os
from datetime import datetime

from flask import (
    Flask,
    render_template_string,
    render_template,
    request)

import dbhelper

app = Flask(__name__)

@app.route('/temp')
def temp():
    '''
    这是一个临时的路由，只是展示render_template_string()的用法的
    '''
    file_path = os.path.join('templates', 'list.html')
    source = open(file_path, 'r', encoding='utf-8').read()
    params = {}
    return render_template_string(source, **params)

@app.route('/')
def note_list():
    '''笔记列表-页面'''
    # 用户要查询的标签的id(用逗号分隔)
    req_tag  = request.values.get('tag', '')
    # 数据库中的标签列表
    tag_list = dbhelper.get_tag_list()
    # 添加一个名为全部的标签
    tag_list.insert(0, {
        'id': 0,
        'name': '全部'
    })
    # 选中的标签
    selected = []
    # 最大的天（明天）
    max_day = datetime.now().day + 1
    # 获取笔记列表
    note_list = dbhelper.get_note_list()
    # 模板需要的参数
    params = {
        'tags' : tag_list,
        'selected': selected,
        'days': ['2018-07-{0:02d}'.format(i) for i in range(1, max_day)],
        'note_list': note_list,
        'length': len(note_list)
    }
    return render_template('list.html', **params)

@app.route('/edit')
def note_edit():
    '''编辑现有（或新建）笔记-页面'''
    # 获取要编辑的笔记的id
    req_id = request.values.get('id', None)
    # id有效性（仅数据格式上的）判断
    if bool(req_id) and req_id.isdigit():
        req_id = int(req_id)
        # 根据id从数据库中查询笔记
        data = dbhelper.get_note_by_id(req_id)
        # 将笔记中为None的字段替换为空字符串
        for key in data:
            if data[key] is None:
                data[key] = ''
            # 将标签（列表）转化为空格分隔的字符串
            if key == 'tags':
                data[key] = ' '.join(data[key])
    else:
        req_id = None
        data = None
    params = {
        'note_id': req_id,
        'note_data': data
    }
    return render_template('edit.html', **params)

@app.route('/new', methods=['GET', 'POST'])
def note_new():
    '''笔记保存页面'''
    # 获取提交的数据
    req_data = request.values
    # 标题
    title = req_data.get('note-title', None)
    # 内容
    content = req_data.get('note-content', None)
    # 标签
    tags = req_data.get('note-tags', None)
    # 编辑时，笔记id
    note_id = req_data.get('note_id', None)
    # 标题必填检查
    if not bool(title):
        return '请填写标题（title）'
    # 内容如果未填写，替换为None
    if not bool(content):
        content = None
    # 标签如果未填写，替换为None
    if not bool(tags):
        tags = None
    if bool(note_id):
        # 判断note_id是否是数字
        if note_id.isdigit():
            note_id = int(note_id)
        else:
            note_id = None
        if isinstance(note_id, int):
            # 验证id是存在的
            if not dbhelper.is_note_exists_by_id(note_id):
                # 如果不存在，则新建（设置为None）
                note_id = None
    else:
        note_id = None

    affect = dbhelper.update_or_insert_note(title, content, tags, note_id)
    msg = '添加' if note_id is None else '修改'
    if affect > 0:
        return msg + '成功' + '''
        <a href="/">返回</a>
        '''
    return msg + '失败'

@app.route('/detail/<id>')
def note_detail(id=None):
    # 根据id查询出笔记内容
    data = dbhelper.get_note_by_id(id)
    # 渲染模板
    return render_template('detail.html', note_data=data)

if __name__ == '__main__':
    cfg = {
        'host': '0.0.0.0',
        'port': 5000,
        'debug': True
    }
    print('通过 [http:/127.0.0.1:{0}/] 访问'.format(cfg['port']))
    app.run(**cfg)